use serde::Deserialize;
use std::borrow::Cow;

// 将一个 JSON 数据反序列化成 User 类型，同时让 User 中的 name 使用 Cow 来引用 JSON 文本中的内容

#[derive(Debug, Deserialize)]
struct User<'input> {
    #[serde(borrow)]
    name: Cow<'input, str>,
    // user.name是一个Cow<'input, str>类型的字段，其中<'input>表示这个字段的生命周期与输入的JSON文本的生命周期相关联。
    age: u8,
}

fn main() {
    let input = r#"{"name":"xxx" , "age":11}"#; //r 這裡指的是 raw_string_literal； #...# 指的是 raw_string_content
    let user: User = serde_json::from_str(input).unwrap(); // input所有权发生了转移

    // 解析 json 成 User struct，要标注派生宏 #[derive(Deserialize)]。
    // 如果要在 User struct 里的某字段使用 Cow，也要在該字段上加上 #[serde(borrow)]。

    // 当输入的JSON文本是一个引用（Borrowed）时，user.name会记录这个引用的地址和长度。
    // 这意味着user.name字段引用了输入字符串的一小段内存，而不是拥有它。
    // 当输入的JSON文本是一个所有权（Owned）时，user.name会拥有这个字符串。
    // 这意味着user.name字段会在堆上分配一块内存，并将字符串复制到这个内存中。

    match user.name {
        Cow::Borrowed(x) => println!("Cow_borrowed {}", x),
        Cow::Owned(x) => println!("Cow_owned {}", x),
    }
    println!("{}", user.age);

    // let original_string = user.name.into_owned();
    // println!("最初{}", original_string);
}
